home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / revistas / fanzine / fanzine01.dms / fanzine01.adf / 38 < prev    next >
Text File  |  1990-12-11  |  15KB  |  338 lines

  1.  
  2.   ------------------------------------------------------------------------
  3.   ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  4.                  CURSO DE CODIGO MAQUINA AVANZADO PARA EL AMIGA               
  5.  
  6.   Curso escrito y dirigido por:
  7.  
  8.                         SPANISH ARCHER / DARKNESS
  9.  
  10.   CAPITULO I:Una pequeña introducción.                     © S.A.1992
  11.   ________________________________________________________________________
  12.   ------------------------------------------------------------------------
  13.  
  14.  
  15.   ------------------------------------------------------------------------ 
  16.  
  17.    Habla Warlord: Hace unos días le propuse a este buen amigo, que hiciera
  18.   un curso avanzado para el 68000. La idea le gustó,así que planificó  la
  19.   estructura que tendría este cursillo:Comandos del copper, utilización del
  20.   blitter... Sin embargo, por razones de tiempo me ví obligado a pedirle que
  21.   lo hiciera en tan sólo un par de horas (tenía que coger el tren y llevarme
  22.   conmigo el artículo).Así que me reuní con él en su casa, y decidimos hacer
  23.   de este capítulo una pequeña introducción, sobre lo que es la programación
  24.   con el Amiga.Para ello tomamos una rutina que lo que hacía era simplemente 
  25.   inicializar la pantalla, aunque  posteriormente, improvisando  consiguió,
  26.   sin muchos cambios, hacer que se viera "aguilla" en la pantalla. Esta
  27.    rutina es la que aquí se comenta. 
  28.  
  29.     Pedimos perdón por los conceptos que no ha podido explicar, pero que ha
  30.   prometido lo hará en posteriores números, iniciando así el cursillo de
  31.   una forma más lógica y estructurada.
  32.  
  33.     Para seguir este curso es indispensable haberse leido un libro sobre los
  34.   comandos del 68000 (se recomienda el de Anaya),así como de disponer de otro
  35.   de programación más avanzada como puede ser el AMIGA HARDWARE REFERENCE
  36.   MANUAL disponible ya en Español (NORSOFT).
  37.  
  38.     Seguramente habrá cosas que no entendáis, pero como ya os dije, esto es
  39.   solo una pequeña introducción,y explicarlo todo lo que se utiliza aquí es
  40.   difícil,pero no preocuparos que seguro que más adelante os enteraréis  de
  41.    todo y este programa os parecerá muy fácil.
  42.  
  43.  
  44.    Por último,queremos agradecerle su indispensable colaboración para con 
  45.   nuestra, (y vuestra) revista.  ¡GRACIAS!
  46.  
  47.  ---------------------------------------------------------------------------
  48.   
  49.  
  50.              CAPITULO I:Una pequeña rutina (INTRODUCCION)
  51.              ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­  
  52.  
  53.    Bueno, vamos a empezar por lo basico de todo demo-adicto:
  54.   COMO INICIALIZAR UNA PANTALLA (suena facil pero ...).
  55.  
  56.    Como dije antes para este cursillo hacen falta ciertis conocimientos
  57.   previos acerca del 68000 y algo del amiga, por ello no voy a explicar
  58.   todo con absoluto detalle, sino que voy a ir a lo mas importante.
  59.  
  60.   A lo nuestro:
  61.  
  62.    En primer lugar hay que reservar la memoria para la pantalla, esto 
  63.   depende de que pantalla quieras inicializar. La formula para ello es:
  64.  
  65.                       (ANCHO/8)*ALTO*no de BIT PLANOS.
  66.  
  67.   En nuestro caso vamos a inicializar una pantalla de 4 Bit-planos (16
  68.   colores) en baja resolucion sin entrelazar, con unas dimensiones de
  69.   320*256(PAL), por lo tanto el no. de bytes a inicializar seran
  70.      
  71.                           (320/8)*256*4=45960.
  72.  
  73.    ¿Como se le dice al sistema que quieres memoria?.Fácil, el sistema
  74.   provee una serie de rutinas contenidas en las famosas librerias que 
  75.   sirven para el control de la memoria. En nuestro caso las rutinas nece-
  76.   sarias estan en la libreria principal la EXEC.LIBRARY.
  77.  
  78.     Para acceder a una rutina de libreria hay que:
  79.  
  80.   - Abrir la libreria (Expcepto la EXEC.LIBRARY que siempre esta abierta).
  81.   - Poner la base de la libreria (obtenida al abrirla) en A6
  82.   - Conocer el offset (salto indirecto) de la rutina deseada.
  83.   - Conocer e inicializar los parametros de la rutina.
  84.   - saltar a la subrutina con JSR-OFFSET(a6).
  85.  
  86.    En este caso la base de la EXEC esta siempre apuntada en la direccion 4.
  87.    Por lo tanto seria:
  88.  
  89.                                 
  90.                                 
  91.                  move.l 4,a6           ponemos la base de EXEC en A6
  92.                  move.l #45960,d0      en d0 la cantidad de bytes a reservar
  93.                  move.l #$10002,d1     (*)tipo de memoria
  94.                  jsr    -$c6(a6)        salto a allocmem (offset=$c6)
  95.                  move.l d0,bp0          d0 retorna la direccion de la memoria.
  96.                 
  97.   (*) tipos de memoria:
  98.   #$10002=Chip memory (accesibles por los coprocesadores)
  99.   #$10004=Fast Memory (no accesibles por los copro. pero de mas rapido acceso
  100.                                       para el 68000)
  101.  
  102.    Una vez que hemos reservado memoria para la pantalla hay que decirle al
  103.   copper(coprocesador de refresco de pantalla, el cual lo veremos mucho más
  104.   a fondo en otro articulo debido a su importancia) donde estan los Bit-planos
  105.    Para ello hay que crear una lista copper. Una lista copper son una serie
  106.   de instrucciones que contienen una cadena de comandos que solo entiende el
  107.   copper y que permiten hacer muchas cosas al tener acceso a los registros 
  108.   del sistema. Esta vez vamos a hacer una lista copper hiper-básica ya que 
  109.   sólo va a refrescar los registros de los bit-planes. Para ello tenemos que
  110.   meter la direccion de cada uno de los cuatro bit-planos en los registros
  111.   del sistema para este proposito. Estos registros son de 16 bits.Por lo 
  112.   tanto hay dos registros para cada bit-planes. Estos son BPLxPTH y PBLxPTL
  113.   (donde x es el no. de bit-plane ). Van del $0e0 y 0e2 para el bit-plano 0 al
  114.   $0f4 y $0f6 para el bit-plano 5.(mirar aspecto de la lista copper al final
  115.   del listado para tener una cierta referencia)
  116.  
  117.    Como el copper tiene que acceder al su lista en la chip-mem hay reservar
  118.   espacio para la lista-copper en chip-mem tal como hicimos antes:
  119.                  
  120.                   move.l #listacopper,d1
  121.                   move.l #listacopperfin,d0
  122.                   sub.l  d1,d0                                
  123.                   move.l d0,copperlong      halla la longitud en bytes de la
  124.                   move.l #$10002,d1         lista copper
  125.                   jsr    -$c6(a6)           allocmem con la cantidad de memo-
  126.                   move.l d0,copperl         ria de la lista cooper
  127.                                 
  128.    Una vez creada la lista copper hay que meterle las direcciones de los 
  129.   bit-planos  en la lista copper para que los refresque. Asi:
  130.  
  131.                   move.l  bp0,d0
  132.                   add.l   #10240,d0
  133.                   move.l  d0,bp1
  134.                   add.l   #10240,d0
  135.                   move.l  d0,bp2
  136.                   add.l   #10240,d0
  137.                   move.l  d0,bp3
  138.                   move.l  bp0,d0
  139.                   move.w  d0,cbp05
  140.                   swap    d0
  141.                   move.w  d0,cbp0
  142.                   move.l  bp1,d0
  143.                   move.w  d0,cbp15
  144.                   swap    d0
  145.                   move.w  d0,cbp1
  146.                   move.l  bp2,d0
  147.                   move.w  d0,cbp25
  148.                   swap    d0
  149.                   move.w  d0,cbp2
  150.                   move.l  bp3,d0
  151.                   move.w  d0,cbp35
  152.                   swap    d0
  153.                   move.w  d0,cbp3
  154.                                 
  155.    Ahora vamos a abrir la libreria GRAPHIC.LIBRARY para obtener posteriomente
  156.   la direccion de la lista copper actual para no perder la pantalla del DOS.
  157.  
  158.                   movea.l  4,a6
  159.                   lea      grafname,a1
  160.                   clr.l    d0
  161.                   jsr      -$198(a6)
  162.                   move.l   d0,grafbase
  163.                                 
  164.            *************** copper y pantalla ***********************
  165.  
  166.    Ahora, paso la nuestra lista-copper (que no sabemos si esta en chip 
  167.   o en fast mem) a la chip mem que reservamos anteriormente.
  168.   Con un simple bucle basta:
  169.                                 
  170.                   movea.l   copperl,a0
  171.                   lea       listacop,a1
  172.                   move.l    copperlong,d2
  173.       copb        move.b    (a1)+,(a0)+
  174.                   subi      #1,d2
  175.                   bne       copb
  176.  
  177.    Ahora vamos a acceder directamente a ciertos registros del sistema,
  178.   para ello hay que sumar $dff000 al numero de registro para obtener su 
  179.   direccion efectiva. P. Ej: Si queremos acceder al registro del color 0
  180.   ($180) con el 68000 seria $180+$dff000=$dff180. Asi primeramente desco-
  181.   nectamos los canales DMA (otro dia sera la susodicha explicacion) con el
  182.   registro DMACONW ($096)
  183.  
  184.                   move.w    #$01a0,$dff096                
  185.  
  186.   (ver apendices del (*)AMIGA HARDWARE MANUAL para los contenidos de cada bit
  187.   de los registros).
  188.  
  189.    Ahora le damos la direccion de la lista copper al registro oportuno, para
  190.   que el copper sepa donde obtener la lista.
  191.  
  192.                   move.l   copperl,$dff080                                
  193.                   clr.w    $dff088                  Activa el copper!!
  194.                   move.w   #$3081,$dff08e   |
  195.                   move.w   #$30c1,$dff090   \ tamño de la ventana (ver (*)AHM)
  196.                   move.w   #$0038,$dff092   /
  197.                   move.w   #$00d0,$dff094  |
  198.  
  199.    Ahora vamos a decir el tipo de pantalla que vamos inicializar. Para este
  200.   objetivo tenemos el registro BPLCON0 ($100), cuyos bits describo ahora: 
  201.                                 
  202.                      BIT no.   NOMBRE                FUNCION
  203.                      -----------------------------------------------
  204.                        15      HIRES        ACTIVA LA ALTA RESOLUCION
  205.                        14      BPU2         }
  206.                        13      BPU1         } NO. DE BIT-PLANES
  207.                        12      BPU0         }
  208.                        11      HOMOD        ACTIVA MODO HAM
  209.                        10      DBLPF        ACTIVA DUAL-PLAYFIELD
  210.                                              (otro dia sera...)
  211.                         9      COLOR        ACTIVA EL COLOR
  212.                         8      GAUD         AUDIO PARA EL GENLOCK
  213.                         7      ----         }
  214.                         6      ----         }  NO USADOS
  215.                         5      ----         }
  216.                         4      ----         }
  217.                         3      LPEN         PARA EL LAPIZ OPTICO
  218.                         2      LACE         ACTIVA EL ENTRELAZADO
  219.                         1      ERSY         PARA SINCRONIZAR CON FUENTE
  220.                                                EXTERNA (GENLOCK...)
  221.                         0      ----         NO USADO
  222.  
  223.  
  224.    Por lo tanto en nuestro ejemplo sera (no hi-res, %100 para el no de bit-
  225.    planos,no HAM,no DUAL,color activo,sin entrelazar, etc...)
  226.  
  227.                      move.w                #%0100001000000000,$dff100 
  228.  
  229.  
  230.                      clr.w   $dff102 |
  231.                      clr.w   $dff104  \modulos de las pantallas
  232.                      clr.w   $dff108  /(ver AHM)
  233.                      clr.w   $dff10a |
  234.                    
  235.                      move.w  #$87c0,$dff096     Activa canales DMA!!
  236.                      move.w  #$000,$dff180     pone negro el color de fondo
  237.                                                                                 
  238.    y listo... ya tenemos una hermosa pantalla en negro con la que 
  239.   podemos hacer futuras maravillas.
  240.  
  241.                 ****************programa principal****************                
  242.  
  243.       Bueno, ahora vienen las chorradas de ultima hora para la utilizacion
  244.      de la pantalla. Ahi va la mia:
  245.  
  246.                 move.w    #$f00,$dff182
  247.                 move.w    #$0f0,$dff184   colores
  248.                 move.w    #$00f,$dff186
  249.      bucle      move.w    #20480,d0
  250.                 move.l    bp0,a0
  251.                 move.l    4,a1
  252.      aguilla    move.w    $dff006,d1   toma el valor de la pos del electron
  253.                 add.w     (a1)+,d1             (pseudoaleatoria)
  254.                 add.w     d1,(a0)+     pone en pantalla la parida.
  255.                 subi.w    #1,d0
  256.                 bne     aguilla
  257.                 btst.b    #6,$bfe001   comprueba el estado del boton izquierdo
  258.                 beq     salida         del ratón
  259.                 bra     bucle
  260.       
  261.  
  262.       
  263.  
  264.                   ************** salida del programa ***************
  265.  
  266.    Una vez que queremos salir de nuestro programa hemos de decirle al sistema
  267.   que hemos dejado libre la memoria anteriomente ocupada por los bp y la 
  268.   lista-copper.
  269.    Para ello estan las rutina freemem de la alloc.lib. Ademas tenemos que
  270.   cerrar las librerias abiertas y inicializar la pantalla del DOS.
  271.  
  272.   Ahi va:
  273.  
  274.    salida      move.l   grafbase,a4   tomo la base de graphics.library en a4
  275.                move.w   #$0580,$dff096   Quito canales DMA
  276.  
  277.  
  278.    La base de la lista copper del DOS esta en la 38 después de la base de la
  279.   graphics.l
  280.    Asi, le digo al copper donde anda la lista copper del dos:
  281.  
  282.                move.l     38(a4),$dff080     
  283.                clr.w     $dff088          Copper activo!
  284.                move.w     #$83a0,$dff096  DMA activos!
  285.           
  286.                movea.l    4,a6            en a6, la base de EXEC.lib
  287.                move.l     copperl,a1      a1=direccion de list.copper
  288.                move.l     copperlong,d0   longitud del bloque a liberar
  289.                jsr        -$d2(a6)        Freemem     (offset $d2)
  290.                move.l     bp0,a1          a1=direccion de los bit-planos
  291.                move.l     #45960,d0       longitud a liberar
  292.                jsr        -$d2(a6)        Freemem de nuevo
  293.                move.l     grafbase,a1     
  294.                jsr        -$19e(a6)       Close library (offset= $19e)
  295.  
  296.                clr.l     d0
  297.                rts                        retorna al DOS
  298.  
  299.  
  300.                     ****** listas copper ************
  301.  
  302.     listacopper
  303.     listacop               dc.w   $e0
  304.     cbp0                   ds.w   1
  305.                            dc.w   $e2
  306.     cbp05                  ds.w   1
  307.                            dc.w   $e4
  308.     cbp1                   ds.w   1
  309.                            dc.w   $e6
  310.     cbp15                  ds.w   1
  311.                            dc.w   $e8
  312.     cbp2                   ds.w   1
  313.                            dc.w   $ea
  314.     cbp25                  ds.w   1
  315.                            dc.w   $ec
  316.     cbp3                   ds.w   1
  317.                            dc.w   $ee
  318.     cbp35                  ds.w   1
  319.                            dc.w   $ffff,$fffe          
  320.     listacopperfin     
  321.  
  322.                  ****** variables globales*************
  323.  
  324.  
  325.       bp0                  ds.l   1
  326.       bp1                  ds.l   1
  327.       bp2                  ds.l   1
  328.       bp3                  ds.l   1
  329.       grafbase             ds.l   1
  330.       copperl              ds.l   1
  331.       copperlong           ds.l   1
  332.       grafname             dc.b   'graphics.library',0
  333.       end
  334.  
  335.    Aquí termina esta primera lección.Espero que os haya sido de utilidad.
  336.   En el próximo número..... MAS.
  337.  
  338.